import sys


def foo():
    print(111)


# print(foo.__name__)

class Foo:
    name = 'cqz'

    def __init__(self, driver=None):
        print(f"当前类, 函数名称：{self.__class__.__name__}， {sys._getframe().f_code.co_name}")
        # return a frame object from the call stack.
        # print(sys._getframe(), type(sys._getframe()))
        # print(sys._getframe().f_code, type(sys._getframe().f_code))
        # print(sys._getframe().f_code.co_name, type(sys._getframe().f_code.co_name))


# f __main__.Foo object at 十六进制内存地址如：0x0000023942EF17F0
f = Foo()
print(Foo, type(Foo))
print(f, type(f))
"""
python解释器创建类时会同步生成与类名"Myclass"同名的一个类型对象,类型对象Myclass
是内置builtins模块的type类的一个实例，表示一个类型。这个类型对象除了继承有type类
的实例属性（比如type类又从基类object继承的__class__实例属性）外，还"吸收"了用户
定义类时定义的类属性，当用户定义的类属性与type类的实例属性重名时，type类的实例属
性将屏蔽用户定义的类属性，比如下例用户覆盖定义了"__class__"类属性，但不管在类方法
内访问__class__（即cls.__class__），还是在全局作用域访问（即Myclass.__class__）都
访问的是type类属性，而不是用户定义的类属性。只有在类型对象Myclass的__dict__字典中
才能访问到用户定义的同名类属性
    总结：类型对象的实例属性由两部分组成：1、type类的实例属性，如值恒为<class 'type'>
的__class__属性；2、用户定义类时提供的类属性；
2、动态语言>>python变量的类型属性__class__的值>>python变量的类型>>变量可执行的操作。典型用法：继承，基类方法重写。
当然，变量执行操作时会对方法进行名字查找，找不到的话就会提示属性错误"AttributeError"，因此变量的类型属性__class__不能乱改。
"""


class Myclass:
    attrcls1 = 'heihei'
    __class__ = 'haha'

    @classmethod
    def ClsMethod(cls):
        print('cls.__class__: ', cls.__class__)


Myclass.ClsMethod()
print('Myclass.__class__: ', Myclass.__class__)
print(Myclass.attrcls1)
print('Myclass.__dict__["__class__"]: ', Myclass.__dict__['__class__'])
# 紫色：str,list,dict,tuple,set等方法或类型functiontype，无颜色：object
print(type(foo.__name__), type(foo.__class__), type(foo.__dict__), type(foo.__init__()), type(foo.__setattr__("path","/usr")))
foo.__call__()
# print(foo.path)
# print(dir(f))
print(dir(foo))
print(dir(Foo))
dif = []
for i in dir(foo):
   if dir(Foo).count(i) == 0:
       dif.append(i)
print(f"方法有类没有的:{dif}")
dif.clear()

for i in dir(Foo):
   if dir(foo).count(i) == 0:
       dif.append(i)
print(f"类有方法没有的:{dif}")
dif.clear()

for i in dir(foo):
   if dir(Foo).count(i) >= 1:
       dif.append(i)
print(f"方法和类都有的:{dif}")

# l = []
# print(l.count("i"))

foo.__call__()
foo()
print(Foo.__instancecheck__(f))
print(type(f))
print(type(Foo))
print(type(Myclass))

